package com.letv.core.network.volley.toolbox;

import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import android.text.TextUtils;

import com.letv.core.utils.BaseTypeUtils;
import com.letv.core.utils.LogInfo;

/**
 * 封装http参数
 * 
 * @author zhuqiao
 * 
 */
public class ParameterBuilder {
    private static final String ENCODING = HTTP.UTF_8;
    private static final String LOG_TAG_LETVHTTP = "LetvHttp";

    /**
     * 封装成字节数组类型的参数,并返回
     * <p>
     * 用于post请求
     * 
     * @param params 参数
     * @return
     */
    public static byte[] getByteArrayParams(Map<String, String> params) {
        if (BaseTypeUtils.isMapEmpty(params)) {
            return null;
        }

        StringBuilder encodedParams = new StringBuilder();
        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
                    continue;
                }

                encodedParams.append(URLEncoder.encode(key, ENCODING));
                encodedParams.append('=');
                encodedParams.append(URLEncoder.encode(value, ENCODING));
                encodedParams.append('&');
            }
            return encodedParams.toString().getBytes(ENCODING);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 封装成查询类型的地址,并返回
     * <p>
     * 用“&”符号隔开，每个参数的名和值用“=”符号隔开
     * 
     * @param list 参数
     * @param urlBegin
     * @return
     */
    public static String getQueryUrl(List<BasicNameValuePair> list, String urlBegin) {
        if (BaseTypeUtils.isListEmpty(list) || TextUtils.isEmpty(urlBegin)) {
            return null;
        }

        StringBuilder encodedParams = new StringBuilder();
        try {
            if (!urlBegin.endsWith("?")) {
                encodedParams.append("?");
            }
            for (BasicNameValuePair pair : list) {
                String key = pair.getName();
                String value = pair.getValue();
                if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
                    continue;
                }

                encodedParams.append(URLEncoder.encode(key, ENCODING));
                encodedParams.append("=");
                encodedParams.append(URLEncoder.encode(value, ENCODING));
                encodedParams.append("&");
            }
            String result = encodedParams.toString();
            if (!TextUtils.isEmpty(result)) {
                // 去掉最后的&
                LogInfo.log(LOG_TAG_LETVHTTP, urlBegin + result.substring(0, result.length() - 1));
                return urlBegin + result.substring(0, result.length() - 1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 封装成文件地址类型的地址,并返回
     * <p>
     * 由零或多个“/”符号隔开的字符串
     * 
     * @param list
     * @param urlBegin
     * @param urlEnd
     * @return
     */
    public static String getPathUrl(List<BasicNameValuePair> list, String urlBegin, String urlEnd) {
        if (BaseTypeUtils.isListEmpty(list)) {
            return null;
        }

        StringBuilder encodedParams = new StringBuilder();
        try {
            for (BasicNameValuePair pair : list) {
                String key = pair.getName();
                String value = pair.getValue();
                if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
                    continue;
                }

                encodedParams.append("/");
                encodedParams.append(URLEncoder.encode(key, ENCODING));
                encodedParams.append("/");
                encodedParams.append(URLEncoder.encode(value, ENCODING));
            }

            String result = encodedParams.toString();
            LogInfo.log(LOG_TAG_LETVHTTP, urlBegin + result + BaseTypeUtils.ensureStringValidate(urlEnd));
            return urlBegin + result + BaseTypeUtils.ensureStringValidate(urlEnd);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

//    /**
//     * 参数封装成StringBody
//     * 
//     * @param params 参数
//     * @return
//     */
//    public static Map<String, StringBody> getStringBody(Map<String, String> params, boolean encode) {
//        if (BaseTypeUtils.isMapEmpty(params)) {
//            return null;
//        }
//
//        try {
//            Map<String, StringBody> result = new HashMap<String, StringBody>();
//            for (Map.Entry<String, String> entry : params.entrySet()) {
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
//                    continue;
//                }
//
//                if (encode) {
//                    result.put(key, new StringBody(URLEncoder.encode(value, ENCODING)));
//                } else {
//                    result.put(key, new StringBody(value));
//                }
//            }
//            return result;
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return null;
//    }

//    /**
//     * 参数封装成FileBody
//     * 
//     * @param params 参数
//     * @return
//     */
//    public static FormFile[] getFileBody(Map<String, String> params) {
//        if (BaseTypeUtils.isMapEmpty(params)) {
//            return null;
//        }
//
//        Map<String, FileBody> result = new HashMap<String, FileBody>();
//        for (Map.Entry<String, String> entry : params.entrySet()) {
//            String key = entry.getKey();
//            String value = entry.getValue();
//            if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
//                continue;
//            }
//
//            File file = new File(value);
//            if (file.exists()) {
//                result.put(key, new FileBody(file));
//            }
//        }
//
//        return result;
//    }
}
